/***********************************************************************************
 * 文件名： mcu_uart.c
 * 作者： 刘言
 * 版本： 1
 * 说明：
 *      UART驱动。中断入口统一定义在 isr.c 中。
 *      在中断入口函数处直接调用各个模块事件通知函数。
 * 修改记录：
 * 	2024/8/27: 初版。 刘言。
***********************************************************************************/
#include "mcu_uart.h"

#define _UART_PEIE      0       // 1：开启奇偶校验错误中断
#define _UART_PS        0       // 1: 奇校验
#define _UART_PCE       0       // 1: 奇偶校验使能


/**
  * @brief  Compute USARTDIV value according to Peripheral Clock and
  *         expected Baud Rate in 16 bits sampling mode (32 bits value of USARTDIV is returned)
  * @param  __PERIPHCLK__ Peripheral Clock frequency used for USART instance
  * @param  __BAUDRATE__ Baud rate value to achieve
  * @retval USARTDIV value to be used for BRR register filling in OverSampling_16 case
  */
#define __LL_USART_DIV_SAMPLING16_100(__PERIPHCLK__, __BAUDRATE__)     (((__PERIPHCLK__)*25)/(4*(__BAUDRATE__)))
#define __LL_USART_DIVMANT_SAMPLING16(__PERIPHCLK__, __BAUDRATE__)     (__LL_USART_DIV_SAMPLING16_100((__PERIPHCLK__), (__BAUDRATE__))/100)
#define __LL_USART_DIVFRAQ_SAMPLING16(__PERIPHCLK__, __BAUDRATE__)     (((__LL_USART_DIV_SAMPLING16_100((__PERIPHCLK__), (__BAUDRATE__)) - (__LL_USART_DIVMANT_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) * 100)) * 16 + 50) / 100)
/* USART BRR = mantissa + overflow + fraction
            = (USART DIVMANT << 4) + (USART DIVFRAQ & 0xF0) + (USART DIVFRAQ & 0x0F) */
#define __LL_USART_DIV_SAMPLING16(__PERIPHCLK__, __BAUDRATE__)            (((__LL_USART_DIVMANT_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) << 4) + \
                                                                           (__LL_USART_DIVFRAQ_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) & 0xF0)) + \
                                                                           (__LL_USART_DIVFRAQ_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) & 0x0F))


void Uart_Init()
{
    USART1->CR1 = (1 << 2) | (1 << 3) 
                | (_UART_RXNEIE << 5) 
                | (_UART_TCIE << 6)
                | (_UART_TXEIE << 7)
                | (_UART_PEIE << 8)
                | (_UART_PS << 9)
                | (_UART_PCE << 10)
                | (_UART_EN << 13);
    USART1->CR3 = (_UART_HALFDUPLEX << 3);
    USART1->BRR = (uint16_t)(__LL_USART_DIV_SAMPLING16(F_PCLK, _UART_BAUD));
}

void Uart_WriteByte(u8 c)
{
    USART1->DR = c;// 启动发送
    while (READ_BIT(USART1->SR, USART_SR_TC) == 0);
}

void Uart_Write(const u8 *dat, size_t size)
{
    while(size--)
	{
		Uart_WriteByte(*dat);
		dat++;
	}
}

void Uart_SetBaud(u32 baud)
{
    USART1->BRR = (uint16_t)(__LL_USART_DIV_SAMPLING16(F_PCLK, baud));
}


